package newdaemon

import (
	"fmt"
	"log"
	"os"
	"syscall"
)

func Run(daemon bool) {
	fmt.Printf("进程ID：%d\n", os.Getpid())
	fmt.Printf("父进程ID：%d\n", os.Getppid())
	// 创建守护进程
	if os.Getppid() != 1 {
		fmt.Printf("[主]准备fork子进程\n")
		// fork子进程
		// file, err := os.OpenFile("/dev/null", os.O_RDWR, 0)
		// if err != nil {
		// 	log.Fatal(err)
		// }
		//fmt.Printf("[主]devnull的fd:%d\n", int(file.Fd()))
		// syscall.Dup2(int(file.Fd()), int(os.Stdin.Fd()))
		// syscall.Dup2(int(file.Fd()), int(os.Stdout.Fd()))
		// syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd()))
		_, err := syscall.ForkExec(os.Args[0], os.Args, &syscall.ProcAttr{
			Dir:   ".",
			Files: []uintptr{os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
			Sys: &syscall.SysProcAttr{
				Setsid: true,
			},
			Env: os.Environ(),
		})
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("[主]进程退出\n")
		os.Exit(0)
	}

	// 执行bash
	err := syscall.Exec("/bin/bash", []string{"/bin/bash"}, os.Environ())
	if err != nil {
		log.Fatal(err)
	}
}
